package com.yszd.util;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Key;

import javax.crypto.Cipher;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;
import javax.crypto.spec.IvParameterSpec;

import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;


public class DesCplusUtil {

	/**
    *
    * @Description ECB加密，不要IV
    * @param key 密钥
    * @param data 明文
    * @return Base64编码的密文
    * @throws Exception
    * @author Shindo  
    * @date 2016年11月15日 下午4:42:56
    */
   public static byte[] des3EncodeECB(byte[] key, byte[] data) throws Exception {
       Key deskey = null;
       DESedeKeySpec spec = new DESedeKeySpec(key);
       SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
       deskey = keyfactory.generateSecret(spec);
       Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding");
       cipher.init(Cipher.ENCRYPT_MODE, deskey);
       byte[] bOut = cipher.doFinal(data);
       return bOut;
   }

   /**
    *
    * @Description ECB解密，不要IV
    * @param key 密钥
    * @param data Base64编码的密文
    * @return 明文
    * @throws Exception
    * @author Shindo  
    * @date 2016年11月15日 下午5:01:23
    */
   public static byte[] ees3DecodeECB(byte[] key, byte[] data) throws Exception {
       Key deskey = null;
       DESedeKeySpec spec = new DESedeKeySpec(key);
       SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
       deskey = keyfactory.generateSecret(spec);
       Cipher cipher = Cipher.getInstance("desede" + "/ECB/PKCS5Padding");
       cipher.init(Cipher.DECRYPT_MODE, deskey);
       byte[] bOut = cipher.doFinal(data);
       return bOut;
   }

   /**
    *
    * @Description CBC加密
    * @param key 密钥
    * @param keyiv IV
    * @param data 明文
    * @return Base64编码的密文
    * @throws Exception
    * @author Shindo  
    * @date 2016年11月15日 下午5:26:46
    */
   public static byte[] des3EncodeCBC(byte[] key, byte[] keyiv, byte[] data) throws Exception {
       Key deskey = null;
       DESedeKeySpec spec = new DESedeKeySpec(key);
       SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
       deskey = keyfactory.generateSecret(spec);
       Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
       IvParameterSpec ips = new IvParameterSpec(keyiv);
       cipher.init(Cipher.ENCRYPT_MODE, deskey, ips);
       byte[] bOut = cipher.doFinal(data);
       return bOut;
   }

   /**
    *
    * @Description CBC解密
    * @param key 密钥
    * @param keyiv IV
    * @param data Base64编码的密文
    * @return 明文
    * @throws Exception
    * @author Shindo  
    * @date 2016年11月16日 上午10:13:49
    */
   public static byte[] des3DecodeCBC(byte[] key, byte[] keyiv, byte[] data) throws Exception {
       Key deskey = null;
       DESedeKeySpec spec = new DESedeKeySpec(key);
       SecretKeyFactory keyfactory = SecretKeyFactory.getInstance("desede");
       deskey = keyfactory.generateSecret(spec);
       Cipher cipher = Cipher.getInstance("desede" + "/CBC/PKCS5Padding");
       IvParameterSpec ips = new IvParameterSpec(keyiv);
       cipher.init(Cipher.DECRYPT_MODE, deskey, ips);
       byte[] bOut = cipher.doFinal(data);
       return bOut;
   }
   //使用3DES  ECB方式解密
   public static String doEcbDecoder(String keyStr,String data){
	    String rtn=null;
		try {
			   byte[] key = new BASE64Decoder().decodeBuffer(keyStr);
			   byte[] str3=new BASE64Decoder().decodeBuffer(data);
			   byte[] str4 = ees3DecodeECB(key, str3);
			   rtn = new String(str4,"UTF-8");
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	       return rtn;
   }
 //使用3DES  ECB方式加密
   public static String doEcbEncoder(String keyStr,String data){
	  
	   String rtn=null;
	try {
		 byte[] key = new BASE64Decoder().decodeBuffer(keyStr);
		 byte[] str3 = des3EncodeECB(key, data.getBytes("UTF-8"));
		 rtn=new BASE64Encoder().encode(str3);
	} catch (UnsupportedEncodingException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (Exception e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	  
	   return rtn;
   }
	
	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		byte[] key = new BASE64Decoder().decodeBuffer("PmI9wZmSV6GtAOQL8fDqUVHSiHet5Axh");
        byte[] keyiv = { 1, 2, 3, 4, 5, 6, 7, 8 };
        byte[] data = "{test:\"json返回测试\"}".getBytes("UTF-8");
        System.out.println("ECB加密解密");
       // byte[] str3 = des3EncodeECB(key, data);
        byte[] str3=new BASE64Decoder().decodeBuffer("Emtt1TllKOoE3CcXsXb1klOyV5lkpF9lLESrAlosZkWPrRZmUUlzUDeki7DDfFdqyvJ6RUWKW5/Q3bbak8Q82v/b9Vo5XEqVjf44q/gevwv1fxNILioxRy91t9MVdfj2uDCxQAo/HC6Kn0zQjNJHFU4eC2ulJ/qJKyr2U7sblcsD/a32sbbcYQGHM0DtGMedB4vAgJYignSq9J5qUMPFcE14iOH1Y5WW8cl/Q9WARNezgRPikzMeOJzgh8TNli4yxPLZVFoaYUWzqBok3xsKpYW89kmMiHfRZAgkFmp1mrWlHa0h17zlYKNrqngY/5zcHPjtcvP70+M4iitGycXYwdSQ03sFCX/Njo18QtgvFOQyTSGtpL9oHq1mSOlpQnAUXijigmtyaSeL7U8kIMibAvOdvx56yLDX");
        byte[] str4 = ees3DecodeECB(key, str3);
        System.out.println(new BASE64Encoder().encode(str3));
        System.out.println(new String(str4, "UTF-8"));
        System.out.println();
        
        
        
        
 
        System.out.println("CBC加密解密");
        byte[] str5 = des3EncodeCBC(key, keyiv, data);
        byte[] str6 = des3DecodeCBC(key, keyiv, str5);
        System.out.println(new BASE64Encoder().encode(str5));
        System.out.println(new String(str6, "UTF-8"));
 
        /*String str7 = "uHrew7Thp2taL2NJpSJhF2mdFMP7BZ1W";
        byte[] str8 = new BASE64Decoder().decodeBuffer(str7);
        byte[] str9 = des3DecodeCBC(key, keyiv, str8);
        System.out.println(new String(str9, "UTF-8"));*/

	}

}
